package com.leetcode.array;

import java.util.ArrayList;
import java.util.List;

/**
 * 216. 组合总和 III
 * 找出所有相加之和为n 的k个数的组合。组合中只允许含有 1-9 的正整数，并且每种组合中不存在重复的数字。
 * 说明：
 * 所有数字都是正整数。
 * 解集不能包含重复的组合。
 * 示例 1:
 * 输入: k = 3, n = 7
 * 输出: [[1,2,4]]
 * 示例 2:
 * 输入: k = 3, n = 9
 * 输出: [[1,2,6], [1,3,5], [2,3,4]]
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/combination-sum-iii
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * @author ymy
 * @date 2021年11月22日 17:27
 */
class Code216{
    public static void main(String[] args) {
        Code216 code = new Code216();
        List<List<Integer>> list = code.combinationSum3(3,9);
        System.out.println(list);
    }
    List<List<Integer>> list = new ArrayList<>();
    List<Integer> temp = new ArrayList<>();
    int sum = 0;
    public List<List<Integer>> combinationSum3(int k, int n) {
        dfs(k,n,1);
        return list;
    }
    public void dfs(int k,int n,int num){
        if(sum == n && temp.size() == k){
            list.add(new ArrayList<>(temp));
            return;
        }
        if(sum > n || temp.size()>k){
            return;
        }
        //剪枝操作：如果 sum + i > n 就终止遍历
        for(int i=num;i<=9 && sum + i <= n;i++){
            sum+=i;
            temp.add(i);
            dfs(k,n,i+1);
            sum-=i;
            temp.remove(temp.size()-1);
        }
    }
}
